package com.dragonsky.shop.product.utils;

import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.dragonsky.shop.product.entity.BasicEntity;
import org.apache.ibatis.annotations.Mapper;

import java.nio.file.Paths;
import java.util.Collections;

public class FastAutoGenerator {

    /**
     * 数据库链接
     */
    private static final String url = "jdbc:mysql://192.168.31.57:3306/shop_product?useSSL=false&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true";
    /**
     * 数据库用户名
     */
    private static final String username = "root";
    /**
     * 数据库密码
     */
    private static final String password = "root";

    public static void main(String[] args) {
        com.baomidou.mybatisplus.generator.FastAutoGenerator.create(url, username, password)
            // 全局配置
            .globalConfig(builder -> builder
                // 设置作者
                .author("dragon")
                // 开启 swagger 模式
                // .enableSwagger()
                // 指定输出目录
                .outputDir(Paths.get(System.getProperty("user.dir")) + "/shop-product/src/main/java")
                // 禁止打开输出目录
                .disableOpenDir()
                // 开启 kotlin 模式
                // .enableKotlin()
                // 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK
                // .dateType(DateType.ONLY_DATE)
                // 注释日期 默认值: yyyy-MM-dd
                .commentDate("yyyy-MM-dd HH:mm:ss")
            )
            // .dataSourceConfig(builder ->
            //     builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
            //         int typeCode = metaInfo.getJdbcType().TYPE_CODE;
            //         if (typeCode == Types.SMALLINT) {
            //             // 自定义类型转换
            //             return DbColumnType.INTEGER;
            //         }
            //         return typeRegistry.getColumnType(metaInfo);
            //     })
            // )
            // 包配置
            .packageConfig(builder -> builder
                    // 设置父包名
                    .parent("com.dragonsky.shop.product")
                    .entity("entity")
                    .mapper("mapper")
                    .service("service")
                    .serviceImpl("service.impl")
                    .xml("mapper.xml")
                    // 设置mapperXml生成路径
                    .pathInfo(Collections.singletonMap(OutputFile.xml, Paths.get(System.getProperty("user.dir")) + "/shop-product/src/main/resources/mapper"))
                // 设置父包模块名
                // .moduleName("api")
                // .pathInfo(Collections.singletonMap(OutputFile.xml, Paths.get(System.getProperty("user.dir")) + "/src/main/resources/mapper/" + builder.build().getModuleName()))
            )
            // 策略配置
            .strategyConfig(builder -> builder
                // 设置需要生成的表名
                .addInclude("sys_product")
                // 设置过滤表前缀
                .addTablePrefix("t_", "c_", "sys_")
                // 开启大写命名
                .enableCapitalMode()

                // Entity 策略配置
                .entityBuilder()
                // 覆盖已生成文件
                // .enableFileOverride()
                // 开启生成字段常量
                .enableColumnConstant()
                // 开启 lombok 模型
                .enableLombok()
                // 开启生成实体时生成字段注解
                .enableTableFieldAnnotation()
                // 设置父类
                .superClass(BasicEntity.class)
                // 禁用生成 serialVersionUID
                // .disableSerialVersionUID()
                // 开启链式模型 如果设置 enableLombok 则无效
                // .enableChainModel()


                // Controller 策略配置
                .controllerBuilder()
                // 覆盖已生成文件
                // .enableFileOverride()
                // 开启生成@RestController 控制器
                .enableRestStyle()


                // Service 策略配置
                .serviceBuilder()
                // 覆盖已生成文件
                // .enableFileOverride()
                // 格式化 service 接口文件名称
                .formatServiceFileName("%sService")
                // 格式化 service 实现类文件名称
                .formatServiceImplFileName("%sServiceImpl")


                // Mapper 策略配置
                .mapperBuilder()
                // 覆盖已生成文件
                // .enableFileOverride()
                // 设置 @Mapper 注解
                .mapperAnnotation(Mapper.class)
                // 启用 BaseResultMap 生成
                .enableBaseResultMap()
                // 启用 BaseColumnList
                .enableBaseColumnList()

                .entityBuilder()
                .enableLombok()
            )
            // 使用Freemarker引擎模板，默认的是Velocity引擎模板
            // .templateEngine(new FreemarkerTemplateEngine())
            // 使用Beetl引擎模板
            // .templateEngine(new BeetlTemplateEngine())
            .execute();
    }

}
